<template>
    <div class="icon-body">
        <el-input v-model="iconName" class="icon-search" clearable placeholder="请输入图标名称" @clear="filterIcons"
            @input="filterIcons">
            <template #suffix><i class="el-icon-search el-input__icon" /></template>
        </el-input>
        <div class="icon-list">
            <div class="list-container">
                <div v-for="(item, index) in iconList" class="icon-item-wrapper" :key="index"
                    @click="selectedIcon(item)">
                    <div :class="['icon-item', { active: activeIcon === item }]">
                        <svg-icon :icon-class="item" class-name="icon" style="height: 25px;width: 16px;" />
                        <span>{{ item }}</span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import icons from './requireIcons';

const props = defineProps({
    activeIcon: {
        type: String
    }
});

const iconName = ref('');
const iconList = ref(icons);
const emit = defineEmits(['selected']);

function filterIcons() {
    iconList.value = icons;
    if (iconName.value) {
        iconList.value = icons.filter(item => item.indexOf(iconName.value) !== -1);
    }
}

function selectedIcon(name: any) {
    emit('selected', name);
    document.body.click();
}

function reset() {
    iconName.value = '';
    iconList.value = icons;
}

defineExpose({
    reset,
});
</script>

<style lang="scss" scoped>
.icon-body {
    width: 100%;
    padding: 10px;

    .icon-search {
        position: relative;
        margin-bottom: 5px;
    }

    .icon-list {
        height: 200px;
        overflow: auto;

        .list-container {
            display: flex;
            flex-wrap: wrap;

            .icon-item-wrapper {
                width: calc(100% / 3);
                height: 25px;
                line-height: 25px;
                cursor: pointer;
                display: flex;

                .icon-item {
                    display: flex;
                    max-width: 100%;
                    height: 100%;
                    padding: 0 5px;

                    &:hover {
                        background: #ececec;
                        border-radius: 5px;
                    }

                    .icon {
                        flex-shrink: 0;
                    }

                    span {
                        display: inline-block;
                        vertical-align: -0.15em;
                        fill: currentColor;
                        padding-left: 2px;
                        overflow: hidden;
                        text-overflow: ellipsis;
                        white-space: nowrap;
                    }
                }

                .icon-item.active {
                    background: #ececec;
                    border-radius: 5px;
                }
            }
        }
    }
}
</style>
